package org.example.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.example.dao.AdminDao;
import org.example.model.Admin;
import org.example.model.Menu;
import org.example.util.JWTUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Arrays;
import java.util.List;

@Service
// 这个注解表示这是一个服务类，并且在事务中进行操作，如果出现异常，则回滚事务
@Transactional(rollbackFor = Exception.class)
public class AdminService {
    @Autowired
    AdminDao adminDao;

    public PageInfo<Admin>searchAllAdmins(Admin admin) {
        PageHelper.startPage(admin.getPageNumber(), admin.getPageSize()); //1.会自动算出limit后面的开始位置
        List<Admin> admins =  adminDao.searchAllAdmins(admin); //2.重新发一条sql,查询总条数
        PageInfo<Admin> pageInfo = new PageInfo<>(admins);
        return pageInfo;
    }
    public List<Menu>searchAllMenus(){
        return adminDao.searchAllMenus();
    }
    public void addAdmin(@RequestBody Admin admin,String adminToken) {
        //1.从Token中获取用户id
        Admin operAdmin = JWTUtil.getAdmin(adminToken);
        admin.setAdmin(operAdmin);//封装操作人
        //2.生成默认密码 md5加密 手机后六位为初始密码并进行加密
        String md5Password = DigestUtils.md5DigestAsHex(admin.getPhone().substring(admin.getPhone().length()-6).getBytes());
        admin.setPassword(md5Password);
        //3.保存管理信息到admin表
        adminDao.insertAdmin(admin);
        //4.保存管理员和菜单关系
        Integer[] menuIds = admin.getMenuIds();
        if(menuIds!=null){
            for(Integer menuId:menuIds){
                adminDao.insertAdminMenu(admin.getId(),menuId);
            }
        }
    }

    public Admin findAdminById(Integer id) {
        Admin admin = adminDao.findAdminById(id);
        //把菜单的每个id转化为数组
        Integer[] menusId = admin.getMenus().stream().map(Menu::getId).toArray(Integer[]::new);
        System.out.println(Arrays.toString(menusId));
        admin.setMenuIds(menusId);
        return admin;
    }

    public void updateAdmin(Admin admin, String adminToken) {
        //1.从Token中获取用户id
        Admin operAdmin = JWTUtil.getAdmin(adminToken);
        admin.setAdmin(operAdmin);//封装操作人
        //2.更新管理员数据到管理员表
        adminDao.updateAdmin(admin);
        //3.更新菜单关系
            //3.1先删除原有关系
        adminDao.deleteAdminMenu(admin.getId());
        //3.2再插入新的关系
        Integer[] menuIds = admin.getMenuIds();
        if(menuIds!=null){
            for(Integer menuId:menuIds){
                adminDao.insertAdminMenu(admin.getId(),menuId);
            }
        }
    }

    public void deleteAdminById(Integer id) {
        //先删除菜单关系
        adminDao.deleteAdminMenu(id);
        //再删除管理员
        adminDao.deleteAdminById(id);
    }
}
